home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1993 April
/
CICA MS Windows - April 1993.iso
/
unzipped
/
util
/
mews11
/
lock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-14
|
4KB
|
174 lines
/* LOCK: File locking command routines for MicroEMACS
written by Daniel Lawrence
*/
#include <stdio.h>
#include "estruct.h"
#include "eproto.h"
#include "edef.h"
#include "elang.h"
#if FILOCK
#if BSD || WMCS || SUN || XENIX || HPUX || AVIION || USG
#include <sys/errno.h>
extern int sys_nerr; /* number of system error messages defined */
extern char *sys_errlist[]; /* list of message texts */
#endif
extern int errno; /* current error */
char *lname[NLOCKS]; /* names of all locked files */
int numlocks; /* # of current locks active */
/* lockchk: check a file for locking and add it to the list */
lockchk(fname)
char *fname; /* file to check for a lock */
{
register int i; /* loop indexes */
register int status; /* return status */
/* check to see if that file is already locked here */
if (numlocks > 0)
for (i=0; i < numlocks; ++i)
if (strcmp(fname, lname[i]) == 0)
return(TRUE);
/* if we have a full locking table, bitch and leave */
if (numlocks == NLOCKS) {
mlwrite(TEXT173);
/* "LOCK ERROR: Lock table full" */
return(ABORT);
}
/* next, try to lock it */
status = lock(fname);
if (status == ABORT) /* file is locked, no override */
return(ABORT);
if (status == FALSE) /* locked, overriden, dont add to table */
return(TRUE);
/* we have now locked it, add it to our table */
lname[++numlocks - 1] = (char *)malloc(strlen(fname) + 1);
if (lname[numlocks - 1] == NULL) { /* malloc failure */
undolock(fname); /* free the lock */
mlwrite(TEXT174);
/* "Cannot lock, out of memory" */
--numlocks;
return(ABORT);
}
/* everthing is cool, add it to the table */
strcpy(lname[numlocks-1], fname);
return(TRUE);
}
/* lockrel: release all the file locks so others may edit */
lockrel()
{
register int i; /* loop index */
register int status; /* status of locks */
register int s; /* status of one unlock */
status = TRUE;
while (numlocks-- > 0) {
if ((s = unlock(lname[numlocks])) != TRUE)
status = s;
free(lname[numlocks]);
}
return(status);
}
/* lock: Check and lock a file from access by others
returns TRUE = files was not locked and now is
FALSE = file was locked and overridden
ABORT = file was locked, abort command
*/
lock(fname)
char *fname; /* file name to lock */
{
register char *locker; /* lock error message */
register int status; /* return status */
char msg[NSTRING]; /* message string */
/* attempt to lock the file */
locker = dolock(fname);
if (locker == NULL) /* we win */
return(TRUE);
/* file failed...abort */
if (strncmp(locker, TEXT175, 4) == 0) {
/* "LOCK" */
lckerror(locker);
return(ABORT);
}
/* someone else has it....override? */
strcpy(msg, TEXT176);
/* "File in use by " */
strcat(msg, locker);
strcat(msg, TEXT177);
/* ", overide?" */
status = mlyesno(msg); /* ask them */
if (status == TRUE)
return(FALSE);
else
return(ABORT);
}
/* unlock: Unlock a file
this only warns the user if it fails
*/
unlock(fname)
char *fname; /* file to unlock */
{
register char *locker; /* undolock return string */
/* unclock and return */
locker = undolock(fname);
if (locker == NULL)
return(TRUE);
/* report the error and come back */
lckerror(locker);
return(FALSE);
}
lckerror(errstr) /* report a lock error */
char *errstr; /* lock error string to print out */
{
char obuf[NSTRING]; /* output buffer for error message */
strcpy(obuf, errstr);
strcat(obuf, " - ");
#if BSD || WMCS || SUN || XENIX || HPUX || AVIION || USG
if (errno < sys_nerr)
strcat(obuf, sys_errlist[errno]);
else
strcat(obuf, TEXT178);
/* "[can not get system error message]" */
#else
strcat(obuf, "Error # ");
strcat(obuf, int_asc(errno));
#endif
mlwrite(obuf);
}
#else
lckhello() /* dummy function */
{
}
#endif